session照片上传状态

chengzhenyu 7 anos atrás
pai
commit
fd6ed08d3b

+ 6 - 5
app/src/main/java/ai/pai/lensman/bean/PhotoBean.java

@@ -3,9 +3,9 @@ package ai.pai.lensman.bean;
3 3
 
4 4
 import java.io.Serializable;
5 5
 
6
-public class PhotoBean implements Serializable{
6
+public class PhotoBean implements Serializable {
7 7
 
8
-    public long    photoId;
8
+    public long photoId;
9 9
 
10 10
     public String photoPath;
11 11
 
@@ -35,13 +35,13 @@ public class PhotoBean implements Serializable{
35 35
 
36 36
     @Override
37 37
     public boolean equals(Object obj) {
38
-        if(obj == this){
38
+        if (obj == this) {
39 39
             return true;
40 40
         }
41
-        if(!(obj instanceof PhotoBean)){
41
+        if (!(obj instanceof PhotoBean)) {
42 42
             return false;
43 43
         }
44
-        return (((PhotoBean) obj).photoId==this.photoId);
44
+        return (((PhotoBean) obj).photoId == this.photoId);
45 45
     }
46 46
 
47 47
     @Override
@@ -59,5 +59,6 @@ public class PhotoBean implements Serializable{
59 59
         int STATUS_NO_BEGIN = 0;
60 60
         int STATUS_SUCCESS = 1;
61 61
         int STATUS_ERROR = -1;
62
+        int STATUS_UPLOADING = 2;
62 63
     }
63 64
 }

+ 25 - 22
app/src/main/java/ai/pai/lensman/service/UploadService.java

@@ -15,7 +15,7 @@ import ai.pai.lensman.bean.PhotoBean;
15 15
 import ai.pai.lensman.db.DBService;
16 16
 import ai.pai.lensman.db.Preferences;
17 17
 
18
-public class UploadService extends Service implements UploadTask.OnPhotoUploadListener,Handler.Callback{
18
+public class UploadService extends Service implements UploadTask.OnPhotoUploadListener, Handler.Callback {
19 19
 
20 20
     private PhotoBean currentPhoto;
21 21
     private PhotoUploadListener listener;
@@ -37,44 +37,46 @@ public class UploadService extends Service implements UploadTask.OnPhotoUploadLi
37 37
 
38 38
     @Override
39 39
     public int onStartCommand(Intent intent, int flags, int startId) {
40
-        if(intent!=null && intent.getSerializableExtra("photo")!=null){
40
+        if (intent != null && intent.getSerializableExtra("photo") != null) {
41 41
             PhotoBean bean = (PhotoBean) intent.getSerializableExtra("photo");
42 42
             bean.uploadStatus = PhotoBean.UploadStatus.STATUS_NO_BEGIN;
43 43
             DBService.getInstance().updatePhotoBean(bean);
44 44
         }
45
-            startUpload();
45
+        startUpload();
46 46
         return super.onStartCommand(intent, flags, startId);
47 47
     }
48 48
 
49
-    private synchronized void startUpload(){
50
-        if(!NetworkUtil.isNetworkConnected(this)){
49
+    private synchronized void startUpload() {
50
+        if (!NetworkUtil.isNetworkConnected(this)) {
51 51
             return;
52 52
         }
53 53
         if (NetworkUtil.isMobileConnected(this) && !Preferences.getInstance().isUploadInMobile()) {
54 54
             return;
55 55
         }
56
-        if(currentPhoto!=null){
57
-            LogHelper.d(TAG,"当前有图片正在上传"+currentPhoto);
56
+        if (currentPhoto != null) {
57
+            LogHelper.d(TAG, "当前有图片正在上传" + currentPhoto);
58 58
             return;
59 59
         }
60 60
 //        LogHelper.d(TAG,"查询是否有可以上传的照片,时间="+System.currentTimeMillis());
61
-         currentPhoto = DBService.getInstance().getNextUploadPhoto();
62
-        if(currentPhoto==null){
61
+        currentPhoto = DBService.getInstance().getNextUploadPhoto();
62
+        if (currentPhoto == null) {
63 63
             handler.removeMessages(MSG_TRY_UPLOAD);
64
-            handler.sendEmptyMessageDelayed(MSG_TRY_UPLOAD,2000);
64
+            handler.sendEmptyMessageDelayed(MSG_TRY_UPLOAD, 2000);
65 65
 //            LogHelper.d(TAG,"本地图片已全部上传");
66 66
             return;
67 67
         }
68
-        LogHelper.d(TAG,"即将上传的照片是"+currentPhoto);
69
-        new UploadTask(currentPhoto,this).executeOnExecutor(ThreadExecutor.getInstance().getExecutor());
68
+        LogHelper.d(TAG, "即将上传的照片是" + currentPhoto);
69
+        currentPhoto.uploadStatus = PhotoBean.UploadStatus.STATUS_UPLOADING;
70
+        DBService.getInstance().updatePhotoBean(currentPhoto);
71
+        new UploadTask(currentPhoto, this).executeOnExecutor(ThreadExecutor.getInstance().getExecutor());
70 72
     }
71 73
 
72 74
     @Override
73 75
     public void onPhotoUploadSucceed(PhotoBean bean) {
74
-        if(bean.equals(currentPhoto)){
75
-            currentPhoto.uploadStatus =  PhotoBean.UploadStatus.STATUS_SUCCESS;
76
+        if (bean.equals(currentPhoto)) {
77
+            currentPhoto.uploadStatus = PhotoBean.UploadStatus.STATUS_SUCCESS;
76 78
             DBService.getInstance().updatePhotoBean(currentPhoto);
77
-            if(listener!=null){
79
+            if (listener != null) {
78 80
                 listener.onPhotoUploaded(currentPhoto);
79 81
             }
80 82
             currentPhoto = null;
@@ -84,10 +86,10 @@ public class UploadService extends Service implements UploadTask.OnPhotoUploadLi
84 86
 
85 87
     @Override
86 88
     public void onPhotoUploadFail(PhotoBean bean) {
87
-        if(bean.equals(currentPhoto)){
88
-            currentPhoto.uploadStatus =  PhotoBean.UploadStatus.STATUS_ERROR;
89
+        if (bean.equals(currentPhoto)) {
90
+            currentPhoto.uploadStatus = PhotoBean.UploadStatus.STATUS_ERROR;
89 91
             DBService.getInstance().updatePhotoBean(currentPhoto);
90
-            if(listener!=null){
92
+            if (listener != null) {
91 93
                 listener.onPhotoUploadError(currentPhoto);
92 94
             }
93 95
             currentPhoto = null;
@@ -95,27 +97,28 @@ public class UploadService extends Service implements UploadTask.OnPhotoUploadLi
95 97
         startUpload();
96 98
     }
97 99
 
98
-    public void setPhotoUploadListener(PhotoUploadListener listener){
100
+    public void setPhotoUploadListener(PhotoUploadListener listener) {
99 101
         this.listener = listener;
100 102
     }
101 103
 
102 104
     @Override
103 105
     public boolean handleMessage(Message message) {
104
-        if(message.what == MSG_TRY_UPLOAD){
106
+        if (message.what == MSG_TRY_UPLOAD) {
105 107
             startUpload();
106 108
             return true;
107 109
         }
108 110
         return false;
109 111
     }
110 112
 
111
-    public interface PhotoUploadListener{
113
+    public interface PhotoUploadListener {
112 114
         void onPhotoUploaded(PhotoBean bean);
115
+
113 116
         void onPhotoUploadError(PhotoBean bean);
114 117
     }
115 118
 
116 119
     public class MyBinder extends Binder {
117 120
 
118
-        public UploadService getService(){
121
+        public UploadService getService() {
119 122
             return UploadService.this;
120 123
         }
121 124
 

+ 52 - 42
app/src/main/java/ai/pai/lensman/session/PhotoRecyclerAdapter.java

@@ -13,16 +13,13 @@ import android.widget.Toast;
13 13
 import com.android.common.utils.DeviceUtils;
14 14
 import com.nostra13.universalimageloader.core.DisplayImageOptions;
15 15
 
16
-import java.io.File;
17 16
 import java.util.ArrayList;
18 17
 
19 18
 import ai.pai.lensman.App;
20 19
 import ai.pai.lensman.R;
21 20
 import ai.pai.lensman.bean.PhotoBean;
22
-import ai.pai.lensman.db.DBService;
23 21
 import ai.pai.lensman.db.Preferences;
24 22
 import ai.pai.lensman.service.UploadService;
25
-import ai.pai.lensman.utils.Constants;
26 23
 import ai.pai.lensman.utils.ImageLoaderUtils;
27 24
 import butterknife.BindView;
28 25
 import butterknife.ButterKnife;
@@ -32,10 +29,11 @@ public class PhotoRecyclerAdapter extends RecyclerView.Adapter<PhotoRecyclerAdap
32 29
     private int width;
33 30
     private Context context;
34 31
     private LayoutInflater mInflater;
35
-    private  DisplayImageOptions options;
32
+    private DisplayImageOptions options;
36 33
     private ArrayList<PhotoBean> photoList;
37 34
     private int delay = 10;
38
-    public PhotoRecyclerAdapter(Context context){
35
+
36
+    public PhotoRecyclerAdapter(Context context) {
39 37
         this.context = context;
40 38
         width = DeviceUtils.getScreenWidth(context);
41 39
         mInflater = LayoutInflater.from(context);
@@ -43,108 +41,120 @@ public class PhotoRecyclerAdapter extends RecyclerView.Adapter<PhotoRecyclerAdap
43 41
         delay = Preferences.getInstance().getUploadDelay();
44 42
     }
45 43
 
46
-    public PhotoBean getPhotoAt(int position){
47
-        if(photoList==null|| photoList.size()<=position ||position<0){
44
+    public PhotoBean getPhotoAt(int position) {
45
+        if (photoList == null || photoList.size() <= position || position < 0) {
48 46
             return null;
49 47
         }
50 48
         return photoList.get(position);
51 49
     }
52 50
 
53
-    public synchronized void addPhotoBean(PhotoBean item){
54
-        if(photoList==null){
51
+    public synchronized void addPhotoBean(PhotoBean item) {
52
+        if (photoList == null) {
55 53
             photoList = new ArrayList<>();
56 54
         }
57
-        if(!photoList.contains(item)){
58
-            photoList.add(0,item);
55
+        if (!photoList.contains(item)) {
56
+            photoList.add(0, item);
59 57
             notifyItemInserted(0);
60
-            notifyItemRangeChanged(0,photoList.size());
58
+            notifyItemRangeChanged(0, photoList.size());
61 59
         }
62 60
     }
63 61
 
64
-    public synchronized void addPreviousPhotos(ArrayList<PhotoBean> photos){
65
-        if(photos==null||photos.size()==0){
62
+    public synchronized void addPreviousPhotos(ArrayList<PhotoBean> photos) {
63
+        if (photos == null || photos.size() == 0) {
66 64
             return;
67 65
         }
68
-        if(photoList==null){
66
+        if (photoList == null) {
69 67
             photoList = new ArrayList<>();
70 68
         }
71
-        if(photoList.size()==0){
69
+        if (photoList.size() == 0) {
72 70
             photoList.addAll(photos);
73 71
             notifyDataSetChanged();
74 72
         }
75 73
     }
76 74
 
77
-    public synchronized void removePhotoAtIndex(int index){
78
-        if(photoList==null || photoList.size()<=index){
75
+    public synchronized void removePhotoAtIndex(int index) {
76
+        if (photoList == null || photoList.size() <= index) {
79 77
             return;
80 78
         }
81 79
         photoList.remove(index);
82 80
         notifyItemRemoved(index);
83
-        notifyItemRangeChanged(0,photoList.size());
81
+        notifyItemRangeChanged(0, photoList.size());
84 82
     }
85 83
 
86 84
     @Override
87 85
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
88
-        return  new MyViewHolder(mInflater.inflate(R.layout.photo_item,parent,false));
86
+        return new MyViewHolder(mInflater.inflate(R.layout.photo_item, parent, false));
89 87
     }
90 88
 
91 89
     @Override
92 90
     public void onBindViewHolder(final MyViewHolder holder, final int position) {
93
-        if(photoList==null){
91
+        if (photoList == null) {
94 92
             return;
95 93
         }
96 94
         final PhotoBean item = photoList.get(position);
97 95
         ImageLoaderUtils.displayLocalImage(item.photoPath, holder.photo, options);
98
-        int height = width*10/16;
99
-        ViewGroup.LayoutParams lp=holder.photo.getLayoutParams();
96
+        int height = width * 10 / 16;
97
+        ViewGroup.LayoutParams lp = holder.photo.getLayoutParams();
100 98
         lp.width = width;
101 99
         lp.height = height;
102 100
         holder.photo.setLayoutParams(lp);
103
-        if(item.uploadStatus == PhotoBean.UploadStatus.STATUS_ERROR){
101
+        if (item.uploadStatus == PhotoBean.UploadStatus.STATUS_ERROR) {
104 102
             holder.errorLayout.setVisibility(View.VISIBLE);
105
-            holder.retryImg.setOnClickListener(new View.OnClickListener(){
103
+            holder.retryImg.setOnClickListener(new View.OnClickListener() {
106 104
                 @Override
107 105
                 public void onClick(View view) {
108 106
                     Intent intent = new Intent(App.getAppContext(), UploadService.class);
109
-                    intent.putExtra("photo",item);
107
+                    intent.putExtra("photo", item);
110 108
                     App.getAppContext().startService(intent);
111 109
                     item.uploadStatus = PhotoBean.UploadStatus.STATUS_NO_BEGIN;
112 110
                     notifyItemChanged(position);
113
-                    Toast.makeText(context,R.string.add_to_upload_queue,Toast.LENGTH_SHORT).show();
111
+                    Toast.makeText(context, R.string.add_to_upload_queue, Toast.LENGTH_SHORT).show();
114 112
                 }
115 113
             });
116
-        }else{
114
+        } else {
117 115
             holder.errorLayout.setVisibility(View.GONE);
118 116
         }
119
-        long timeLeft = delay-(System.currentTimeMillis()-item.captureTime)/1000;
117
+        long timeLeft = delay - (System.currentTimeMillis() - item.captureTime) / 1000;
120 118
 
121
-        if(timeLeft<0|| DBService.getInstance().isPhotoUploaded(item.photoId)){
119
+        if (timeLeft < 0) {
122 120
             item.canDelete = false;
123
-            holder.autoUploadHintText.setVisibility(View.GONE);
124
-        }else{
121
+            if (item.uploadStatus == PhotoBean.UploadStatus.STATUS_ERROR) {
122
+                holder.uploadStatusText.setText(context.getString(R.string.upload_error));
123
+            } else if (item.uploadStatus == PhotoBean.UploadStatus.STATUS_SUCCESS) {
124
+                holder.uploadStatusText.setText(context.getString(R.string.upload_success));
125
+            } else if (item.uploadStatus == PhotoBean.UploadStatus.STATUS_NO_BEGIN) {
126
+                holder.uploadStatusText.setText(context.getString(R.string.upload_in_waiting));
127
+            } else if (item.uploadStatus == PhotoBean.UploadStatus.STATUS_UPLOADING) {
128
+                holder.uploadStatusText.setText(context.getString(R.string.upload_processing));
129
+            }
130
+        } else {
125 131
             item.canDelete = true;
126
-            holder.autoUploadHintText.setVisibility(View.VISIBLE);
127
-            holder.autoUploadHintText.setText(context.getString(R.string.auto_upload_after_seconds,timeLeft));
132
+            holder.uploadStatusText.setText(context.getString(R.string.auto_upload_after_seconds, timeLeft));
128 133
         }
129 134
     }
130 135
 
131 136
     @Override
132 137
     public int getItemCount() {
133
-        if(photoList==null){
138
+        if (photoList == null) {
134 139
             return 0;
135 140
         }
136 141
         return photoList.size();
137 142
     }
138 143
 
139
-    class MyViewHolder extends RecyclerView.ViewHolder{
144
+    class MyViewHolder extends RecyclerView.ViewHolder {
145
+
146
+        @BindView(R.id.iv_session_photo_item)
147
+        ImageView photo;
148
+        @BindView(R.id.layout_upload_fail)
149
+        View errorLayout;
150
+        @BindView(R.id.iv_upload_retry)
151
+        ImageView retryImg;
152
+        @BindView(R.id.tv_upload_status)
153
+        TextView uploadStatusText;
140 154
 
141
-        @BindView(R.id.iv_session_photo_item) ImageView photo;
142
-        @BindView(R.id.layout_upload_fail) View errorLayout;
143
-        @BindView(R.id.iv_upload_retry)  ImageView retryImg;
144
-        @BindView(R.id.tv_auto_upload_hint) TextView autoUploadHintText;
145
-        public MyViewHolder(View view){
155
+        public MyViewHolder(View view) {
146 156
             super(view);
147
-            ButterKnife.bind(this,view);
157
+            ButterKnife.bind(this, view);
148 158
         }
149 159
     }
150 160
 }

+ 1 - 1
app/src/main/java/ai/pai/lensman/session/SessionActivity.java

@@ -209,7 +209,7 @@ public class SessionActivity extends BaseActivity implements SessionContract.Vie
209 209
 
210 210
 
211 211
     @Override
212
-    public void refreshUploadTimeHint() {
212
+    public void refreshRecyclerView() {
213 213
         if(adapter!=null && photosRecyclerView!=null && photosRecyclerView.getVisibility()==View.VISIBLE){
214 214
             photosRecyclerView.post(new Runnable() {
215 215
                 @Override

+ 1 - 1
app/src/main/java/ai/pai/lensman/session/SessionContract.java

@@ -16,7 +16,7 @@ public class SessionContract {
16 16
         void showPhotoRecyclerView();
17 17
         void showEmptyView();
18 18
         void showToast(String toast);
19
-        void refreshUploadTimeHint();
19
+        void refreshRecyclerView();
20 20
         void addPhotos(ArrayList<PhotoBean> photoList);
21 21
         void refreshCameraStatus(String status);
22 22
     }

+ 46 - 3
app/src/main/java/ai/pai/lensman/session/SessionPresenter.java

@@ -1,6 +1,10 @@
1 1
 package ai.pai.lensman.session;
2 2
 
3
+import android.content.ComponentName;
4
+import android.content.Context;
3 5
 import android.content.Intent;
6
+import android.content.ServiceConnection;
7
+import android.os.IBinder;
4 8
 
5 9
 import com.android.common.utils.LogHelper;
6 10
 
@@ -16,7 +20,7 @@ import ai.pai.lensman.db.DBService;
16 20
 import ai.pai.lensman.service.UploadService;
17 21
 
18 22
 
19
-public class SessionPresenter implements SessionContract.Presenter, SessionInteractor.SessionListener{
23
+public class SessionPresenter implements SessionContract.Presenter, SessionInteractor.SessionListener,UploadService.PhotoUploadListener{
20 24
 
21 25
     private SessionInteractor interactor;
22 26
     private ArrayList<PhotoBean> photoList;
@@ -25,12 +29,24 @@ public class SessionPresenter implements SessionContract.Presenter, SessionInter
25 29
     private boolean isWorking;
26 30
     private String groupId;
27 31
     private Timer refreshTimer;
32
+    private ServiceConnection uploadServiceConnection;
28 33
 
29 34
     private static final String TAG = "SessionPresenter";
30 35
 
31 36
     public SessionPresenter(SessionBean sessionBean, SessionContract.View view) {
32 37
         this.sessionView = view;
33 38
         this.sessionBean = sessionBean;
39
+        uploadServiceConnection = new ServiceConnection() {
40
+            @Override
41
+            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
42
+                ((UploadService.MyBinder) iBinder).getService().setPhotoUploadListener(SessionPresenter.this);
43
+            }
44
+
45
+            @Override
46
+            public void onServiceDisconnected(ComponentName componentName) {
47
+
48
+            }
49
+        };
34 50
     }
35 51
 
36 52
     @Override
@@ -55,16 +71,22 @@ public class SessionPresenter implements SessionContract.Presenter, SessionInter
55 71
         refreshTimer.schedule(new TimerTask() {
56 72
             @Override
57 73
             public void run() {
58
-                sessionView.refreshUploadTimeHint();
74
+                sessionView.refreshRecyclerView();
59 75
             }
60 76
         },1000,1000);
61
-
77
+        App.getAppContext().bindService(new Intent(App.getAppContext(),UploadService.class),
78
+                uploadServiceConnection, Context.BIND_AUTO_CREATE);
62 79
     }
63 80
 
64 81
     @Override
65 82
     public void stop() {
66 83
         interactor.endSession();
67 84
         refreshTimer.cancel();
85
+        try{
86
+            App.getAppContext().unbindService(uploadServiceConnection);
87
+        }catch (Exception e){
88
+            e.printStackTrace();
89
+        }
68 90
         isWorking = false;
69 91
         LogHelper.d(TAG,"stop");
70 92
     }
@@ -136,4 +158,25 @@ public class SessionPresenter implements SessionContract.Presenter, SessionInter
136 158
         this.groupId = groupId;
137 159
     }
138 160
 
161
+    @Override
162
+    public void onPhotoUploaded(PhotoBean bean) {
163
+        for(PhotoBean photoBean : photoList){
164
+            if(photoBean.photoId == bean.photoId){
165
+                photoBean.uploadStatus = PhotoBean.UploadStatus.STATUS_SUCCESS;
166
+                sessionView.refreshRecyclerView();
167
+                break;
168
+            }
169
+        }
170
+    }
171
+
172
+    @Override
173
+    public void onPhotoUploadError(PhotoBean bean) {
174
+        for(PhotoBean photoBean : photoList){
175
+            if(photoBean.photoId == bean.photoId){
176
+                photoBean.uploadStatus = PhotoBean.UploadStatus.STATUS_ERROR;
177
+                sessionView.refreshRecyclerView();
178
+                break;
179
+            }
180
+        }
181
+    }
139 182
 }

+ 2 - 2
app/src/main/res/layout/photo_item.xml

@@ -12,7 +12,7 @@
12 12
         android:scaleType="centerCrop"/>
13 13
 
14 14
     <TextView
15
-        android:id="@+id/tv_auto_upload_hint"
15
+        android:id="@+id/tv_upload_status"
16 16
         android:layout_width="match_parent"
17 17
         android:layout_height="48dp"
18 18
         android:gravity="center"
@@ -46,7 +46,7 @@
46 46
             android:layout_height="wrap_content"
47 47
             android:layout_below="@id/iv_upload_retry"
48 48
             android:layout_centerHorizontal="true"
49
-            android:text="@string/upload_error"
49
+            android:text="@string/click_to_retry"
50 50
             android:textSize="16sp"
51 51
             android:textColor="@color/white"/>
52 52
 

+ 10 - 11
app/src/main/res/values/strings.xml

@@ -3,7 +3,7 @@
3 3
     <string name="bar_app_name">拍爱摄影师版</string>
4 4
 
5 5
     <string name="version_text">拍爱 V1.0</string>
6
-    <string name="copyright">Copyright © 2016 </string>
6
+    <string name="copyright">Copyright © 2017 </string>
7 7
     <string name="company_name">北京佳艺徕经贸有限责任公司</string>
8 8
 
9 9
     <string name="bt_connected">已连接</string>
@@ -20,12 +20,6 @@
20 20
     <string name="login_fail">登录失败</string>
21 21
     <string name="please_wait">请稍候</string>
22 22
 
23
-    <string name="upload_processing">上传中</string>
24
-    <string name="upload_error">上传失败</string>
25
-    <string name="upload_success">上传成功</string>
26
-
27
-    <string name="add_to_upload_queue">已加入上传任务列表,尝试中...</string>
28
-
29 23
     <string name="network_disconnect">当前无网络连接</string>
30 24
 
31 25
     <string name="qr_scan_hint">将取景框对准二维码,\n即可自动扫码</string>
@@ -113,10 +107,6 @@
113 107
 
114 108
     <string name="box_status_error">盒子状态错误,请检查</string>
115 109
 
116
-    <string name="auto_upload_after_seconds">距自动上传还有%d秒</string>
117
-
118
-    <string name="can_not_delete">该照片已在上传队列,无法删除</string>
119
-
120 110
     <string name="sdcard_fail">手机sd卡错误</string>
121 111
 
122 112
     <string name="upload_setting">上传延时设置</string>
@@ -153,4 +143,13 @@
153 143
 
154 144
     <string name="upload_in_mobile_network">运营商网络下自动上传</string>
155 145
 
146
+    <string name="can_not_delete">该照片已在上传队列,无法删除</string>
147
+    <string name="auto_upload_after_seconds">距加入上传队列还有%d秒</string>
148
+    <string name="upload_in_waiting">等待上传</string>
149
+    <string name="upload_processing">上传中</string>
150
+    <string name="upload_error">上传失败</string>
151
+    <string name="upload_success">上传成功</string>
152
+
153
+    <string name="click_to_retry">点击重试</string>
154
+    <string name="add_to_upload_queue">已加入上传任务列表,尝试中...</string>
156 155
 </resources>